<?php
// 常理定义
define('EXT','.php');
define('DIR','/');

// 基本路径(框架路径)
define('APP_PATH', realpath(dirname($_SERVER['SCRIPT_FILENAME']). '/../').DIR);
define('VIEW_PATH', APP_PATH.'view'.DIR);
define('CACHE_PATH', VIEW_PATH.'cache'.DIR);
define('LIB_PATH', APP_PATH.'library'.DIR);
define('CORE_PATH', LIB_PATH.'core'.DIR);
define('TOOL_PATH', LIB_PATH.'tool'.DIR);
define('MODEL_PATH', APP_PATH.'model'.DIR);
define('CONFIG_PATH', APP_PATH.'config'.DIR);
define('CONTROLLER_PATH', APP_PATH.'controller'.DIR);

// 资源计算用
define('FM_RUNTIME', microtime(true));
define('FM_MEMONY', memory_get_usage());

// 字符转义用
define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());

try {
    // 加载配置文件
    require CONFIG_PATH.'define'.EXT;
    $framework = parse_ini_file(CONFIG_PATH . 'mvc.ini', TRUE);

    // 加载公共函数
    require CORE_PATH.'IFunction.Core'.EXT;

    // 设置SESSION周期
    session_set_cookie_params(INI('session','expire'));
    session_start();

    // 环境变量
    define('STATIC_PATH', INI('page','static'));
    define('FILE_PATH', INI('page','file'));
    define('DB_PREFIX', INI('db','prefix'));
    define('UPLOAD_PATH', APP_PATH.'/static/upload/');
    define('RP_URL', INI('page','rp_url'));
    define('JIFEN_PATH', INI('page','jifen'));

    // 设定日志文件是否开启
    if(true == INI('env','debug')){
        I(CORE_PATH.'ILog.Core');
        Log::start();
        define('LOG_STATUS', true);
    }else{
        define('LOG_STATUS', false);
        error_reporting(0);
    }

    // 设置时间区域
    date_default_timezone_set(INI('env','timezone'));

    // 加载核心文件
    if(LOG_STATUS) Log::record('================================================================');
    if(LOG_STATUS) Log::record('加载核心文件开始');
    I(CORE_PATH.'IAutoload.Core');
    I(CORE_PATH.'IException.Core');
    I(CORE_PATH.'IJson.Core');
    I(CORE_PATH.'ICookie.Core');
    I(CORE_PATH.'IController.Core');
    I(CORE_PATH.'IMysql.Core');
    I(LIB_PATH.'Controller');
    I(LIB_PATH.'Model');
    I(CORE_PATH.'ISession.Core');
    if(LOG_STATUS) Log::record('加载核心文件完成');

    // 地址解析
    if(LOG_STATUS) Log::record('地址解析开始');
    I(CORE_PATH.'IRewrite.Core');
    if(LOG_STATUS) Log::record('地址解析完成');

    // 基本日志信息
    if(LOG_STATUS){
        Log::record('================================================================');
        Log::record('请求头信息：','limegreen');
        Log::record('　　请求方法：'.$_SERVER['REQUEST_METHOD']);
        Log::record('　　通信协议：'.$_SERVER['SERVER_PROTOCOL']);
        Log::record('　　请求时间：'.date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']));
        Log::record('　　用户代理：'.$_SERVER['HTTP_USER_AGENT']);
        Log::record('================================================================');
        Log::record('GET信息：','limegreen');
        Log::record(DUMP($_GET));
        Log::record('POST信息：','limegreen');
        Log::record(DUMP($_POST));
    }

    // 命名空间/控制器/提交处理
    $controller = CONTROLLER;
    $action = ACTION;

    // 判断用户类型及权限判断
    if (!ISession::has("uid")){ISession::set("uid", 2);}
    if (!FrameworkModel::getInstance()->Permissions(ISession::get("uid"),$controller,$action)){
        $controller = "main";
        $action = "login";
    }

    // 取得控制器类名
    $controller_class = U($controller,true);
    $action_class     = U($action,false);

    // 控制器信息
    if(LOG_STATUS){
        Log::record('================================================================');
        Log::record('控制器信息：','limegreen');
        Log::record('　　Controller：'.$controller);
        Log::record('　　Action：'.$action);
        Log::record('　　Controller Class：'.$controller_class);
        Log::record('　　Action Class：'.$action_class);
    }

    // 加载控制器
    I(CONTROLLER_PATH.$controller_class,'加载控制器');

    // 生产控制器对象
    if(class_exists($controller_class)){
        $APP = new $controller_class();
    }else{
        IException::set('controller class ' . $controller_class . ' don\'t exist!',__FILE__,__LINE__);
    }

    // 调用Action方法
    if (method_exists($APP, $action_class)) {
        $APP->dispatch($controller_class,$action_class);
    } else {
        IException::set('action class ' . $action_class . ' don\'t exist!',__FILE__,__LINE__);
    }

    // 程序性能数据
    if(LOG_STATUS) Log::record(sprintf('系统执行完毕，内存消耗：%01.4fKB，运行计时%01.4f秒', ((memory_get_usage()-FM_MEMONY)/1024), (microtime(true)-FM_RUNTIME)),'limegreen');

    // 正常结束
    if(LOG_STATUS) Log::record('程序正常结束！','limegreen');

    // 打印LOG信息
    if(LOG_STATUS) Log::view();

}catch (Exception $e) {
    IException::set($e->getMessage(),$e->getFile(),$e->getLine());
}
